# -*- coding:utf-8 -*-
__author__ = 'Dragon Sun'
__date__ = '2025-07-03 09:24:35'

import threading
from typing import Any

from PySide6.QtCore import QObject, Signal
from dsPyLib.基类.枚举基类 import 枚举基类

from src.wss.ds_wss_okxv5_base import DSWebSocket
from src.wss.ds_wss_okxv5_private import DS_OKXv5_WSS_私有频道类
from src.wss.ds_wss_okxv5_public import DS_OKXv5_WSS_公共频道类


class 频道枚举(枚举基类):
    公共频道 = 'Public'
    私有频道 = 'Private'


class DSOKXv5WebSocket(QObject):
    信号_最新价格更新 = Signal(float)  # 最新价格
    信号_标记价格更新 = Signal(float)  # 标记价格
    信号_当前持仓变化 = Signal()
    信号_收到USDT余额 = Signal(float)  # USDT余额
    信号_统计数据变化 = Signal(DSWebSocket, 频道枚举)  # 对象, 频道
    信号_发生错误 = Signal(DSWebSocket, Any, 频道枚举)  # 对象, 错误, 频道

    def __init__(self):
        super().__init__()

        self._wss_公共频道 = DS_OKXv5_WSS_公共频道类()
        self._wss_公共频道.最新价格更新回调 = self._最新价格更新处理
        self._wss_公共频道.标记价格更新回调 = self._标记价格更新处理
        self._wss_公共频道.统计数据变化回调 = self._统计数据变化处理
        self._wss_公共频道.发生错误回调 = self._发生错误处理

        self._wss_私有频道 = DS_OKXv5_WSS_私有频道类()
        self._wss_私有频道.当前持仓变化回调 = self._当前持仓变化处理
        self._wss_私有频道.收到USDT余额回调 = self._收到USDT余额处理
        self._wss_私有频道.统计数据变化回调 = self._统计数据变化处理
        self._wss_私有频道.发生错误回调 = self._发生错误处理

        self._thread_公共频道 = threading.Thread(target=self._wss_公共频道.run, args=(False,), daemon=True)
        self._thread_私有频道 = threading.Thread(target=self._wss_私有频道.run, args=(False,), daemon=True)

    def 运行(self):
        if self._thread_公共频道.ident is None:
            self._thread_公共频道.start()
        if self._thread_私有频道.ident is None:
            self._thread_私有频道.start()

    def 运行中(self) -> bool:
        return self._thread_公共频道.is_alive() or self._thread_私有频道.is_alive()

    def 停止(self):
        pass  # 暂不考虑停止的情况

    def _获取频道(self, ds_ws: DSWebSocket) -> 频道枚举:
        if ds_ws == self._wss_公共频道:
            return 频道枚举.公共频道
        if ds_ws == self._wss_私有频道:
            return 频道枚举.私有频道
        raise ValueError('传入错误！')

    def _最新价格更新处理(self, _: DSWebSocket, 最新价格: float):
        self.信号_最新价格更新.emit(最新价格)

    def _标记价格更新处理(self, _: DSWebSocket, 标记价格: float):
        self.信号_标记价格更新.emit(标记价格)

    def _当前持仓变化处理(self, _: DSWebSocket):
        self.信号_当前持仓变化.emit()

    def _收到USDT余额处理(self, _: DSWebSocket, USDT余额: float):
        self.信号_收到USDT余额.emit(USDT余额)

    def _统计数据变化处理(self, ds_ws: DSWebSocket):
        频道 = self._获取频道(ds_ws)
        self.信号_统计数据变化.emit(ds_ws, 频道)

    def _发生错误处理(self, ds_ws: DSWebSocket, 错误: Any):
        频道 = self._获取频道(ds_ws)
        self.信号_发生错误.emit(ds_ws, 错误, 频道)
